package com.haoniu.web.controller.module;

import com.alibaba.fastjson.JSONObject;
import com.haoniu.common.constant.OrderConstants;
import com.haoniu.common.utils.huanxin.HuanXinConstants;
import com.haoniu.framework.util.ShiroUtils;
import com.haoniu.module.domain.database.*;
import com.haoniu.module.domain.dto.UserWalletOutDTO;
import com.haoniu.module.service.*;
import com.haoniu.pay.alipay.AliPay;
import com.haoniu.pay.alipay.RandomUtil;
import com.haoniu.web.controller.tool.HttpClientUtil;
import com.haoniu.web.core.config.MoneyDetailTypeEnum;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.ModelMap;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.haoniu.common.annotation.Log;
import com.haoniu.common.enums.BusinessType;
import com.haoniu.web.core.base.BaseController;
import com.haoniu.framework.web.page.TableDataInfo;
import com.haoniu.common.base.AjaxResult;

import java.math.BigDecimal;
import java.util.*;

/**
 * 提现 信息操作处理
 *
 * @author houyijun
 * @date 2019-01-25
 */
@Controller
@RequestMapping("/module/userWalletOut")
public class UserWalletOutController extends BaseController
{
    private String prefix = "module/userWalletOut";

   @Autowired
   private UserWalletService userWalletService;

	@Autowired
	private UserWalletOutService userWalletOutService;

	@Autowired
	private MerchantPayRecordService merchantPayRecordService;

	@Autowired
	private MerchantInfoService merchantInfoService;

	@Autowired
	private UserMoneyDetailService userMoneyDetailService;

	@RequiresPermissions("module:userWalletOut:view")
	@GetMapping()
	public String userWalletOut(ModelMap mmap)
	{
		// 获取商户的信息
		Map<String, Object> params = new HashMap<>();
		params.put("merchantId", HuanXinConstants.MERCHANT_ID);
		try {
			String result = HttpClientUtil.getInstance().doPost(HuanXinConstants.MERCHANT_BALANCE,params);
			JSONObject jsonObject = JSONObject.parseObject(result);
			mmap.addAttribute("merchantInfoCanUseMoney",jsonObject.getString("avalibleMoney"));
		} catch (Exception e) {
			e.printStackTrace();
		}

		mmap.put("totalWithdrawMoney",userWalletOutService.totalWithdrawMoney());

	    return prefix + "/userWalletOut";
	}

	/**
	 * 查询提现列表
	 */
	@RequiresPermissions("module:userWalletOut:list")
	@PostMapping("/list")
	@ResponseBody
	public TableDataInfo list(UserWalletOut userWalletOut) {
		startPage();
        List<UserWalletOutDTO> list = userWalletOutService.userWalletOutList(userWalletOut);
		return getDataTable(list);
	}

	/**
	 * 新增提现
	 */
	@GetMapping("/add")
	public String add() {
	    return prefix + "/add";
	}

	/**
	 * 新增保存提现
	 */
	@RequiresPermissions("module:userWalletOut:add")
	@Log(title = "提现", businessType = BusinessType.INSERT)
	@PostMapping("/add")
	@ResponseBody
	public AjaxResult addSave(UserWalletOut userWalletOut) {
        userWalletOut.setCreateBy(ShiroUtils.getLoginName());
		return toAjax(userWalletOutService.insertUserWalletOut(userWalletOut));
	}

	/**
	 * 校验订单
	 */
	@PostMapping("/check")
	@ResponseBody
	public AjaxResult check(Integer id) {
		UserWalletOut userWalletOut = userWalletOutService.selectUserWalletOutById(id);
		if (userWalletOut.getStatus() == 1 || userWalletOut.getStatus() == 2) {
			return error("订单已审核或已拒绝");
		}
		return success();
	}

	/**
	 * 修改提现
	 */
	@GetMapping("/toEdit")
	public String edit(Integer id, ModelMap mmap) {
		UserWalletOut userWalletOut = userWalletOutService.selectUserWalletOutById(id);
		mmap.put("userWalletOut", userWalletOut);
	    return prefix + "/edit";
	}

	/**
	 * 修改保存提现
	 */
	@RequiresPermissions("module:userWalletOut:edit")
	@Log(title = "提现", businessType = BusinessType.UPDATE)
	@PostMapping("/edit")
	@ResponseBody
	public synchronized AjaxResult editSave(UserWalletOut userWalletOut) {
		userWalletOut.setUpdateBy(ShiroUtils.getLoginName());
		AjaxResult ajaxResult = null;
		// 根据这个提现记录的id 重新获取到用户的信息
		UserWalletOut userWalletOutReal = userWalletOutService.selectUserWalletOutById(userWalletOut.getId());
		if(userWalletOutReal.getStatus() !=null && userWalletOutReal.getStatus() == 1){
			return error("该订单已成功，不能重复审核");
		}
		if(userWalletOutReal.getStatus() !=null && userWalletOutReal.getStatus() == 2){
			return error("该订单已拒绝，不能重复审核");
		}
		// 检查是同意
		if(userWalletOut.getStatus() == 1){
			// 获取商户的信息
			MerchantInfo merchantInfo = merchantInfoService.selectMerchantInfoById(1);

			// 走支付宝打款接口
			String thisOnlyId = RandomUtil.numberId(10)+ RandomUtil.codeId(10);

			userWalletOut.setAlipayId(thisOnlyId);

			// 冻结金额检查
			UserWallet userWallet = userWalletService.selectUserWalletByUserId(userWalletOutReal.getUserId());
			if(userWallet==null || userWallet.getFreezeMoney()== null ){
				return error("系统异常，请检查用户信息");
			}
			// 检查冻结金额是否符合要求
			if(userWallet.getFreezeMoney().compareTo(userWalletOutReal.getMoney())<0){
				return error("冻结金额不符合系统要求，请检查用户实际情况");
			}

			Map<String, Object> params = new HashMap<>();
			params.put("merchantId", HuanXinConstants.MERCHANT_ID);
			params.put("userName", userWalletOutReal.getRealName());
			params.put("payMoney", userWalletOutReal.getMoney());
			params.put("aliPayAccount", userWalletOutReal.getAlipay());
			params.put("aliPayRequestId", thisOnlyId);
			try {
				// String result = HttpClientUtil.getInstance().doPost(HuanXinConstants.DEFAULT_ALIPAY_URL,params);
				// JSONObject jsonObject = JSONObject.parseObject(result);
				// System.out.println("result :" + result);
				// 代付成功
//				if (Integer.parseInt(jsonObject.getString("code")) == 0){
//					userWalletOut.setStatus(1);
//					BigDecimal afterFreezeMoney = userWallet.getFreezeMoney().subtract(userWalletOutReal.getMoney()).subtract(userWalletOutReal.getProceMoney());
//
//					UserWallet userWalletUpdate =  new UserWallet();
//					userWalletUpdate.setId(userWallet.getId());
//					userWalletUpdate.setFreezeMoney(afterFreezeMoney);
//					userWalletUpdate.setUpdateTime(new Date());
//
//					userWalletService.updateUserWallet(userWalletUpdate);
//
//					// 记录金额流水记录
//					UserMoneyDetail userMoneyDetail = new UserMoneyDetail();
//					userMoneyDetail.setUserId(userWalletOut.getUserId());
//					userMoneyDetail.setMoney(userWalletOutReal.getMoney().add(userWalletOutReal.getProceMoney()));
//					userMoneyDetail.setAfterMoney(userWallet.getMoney());
//					userMoneyDetail.setType(1);
//					userMoneyDetail.setObjectId(userWalletOutReal.getId());
//					userMoneyDetail.setObjectType(MoneyDetailTypeEnum.WITHDRAW.type);
//					userMoneyDetail.setDescription(MoneyDetailTypeEnum.WITHDRAW.desc);
//					userMoneyDetail.setCreateTime(new Date());
//					userMoneyDetailService.insertUserMoneyDetail(userMoneyDetail);
//
//				}
				// 代付失败
//				else{
				//这个红包不要代付，同意即审核成功
					userWalletOut.setStatus(1);
//				}
				ajaxResult = toAjax(userWalletOutService.updateUserWalletOut(userWalletOut));
			} catch (Exception e) {
				e.printStackTrace();
			}
			//还是拒绝
		}else if(userWalletOut.getStatus()== 2){
			UserWalletOut userWalletOutReq = userWalletOutService.selectUserWalletOutById(userWalletOut.getId());
			userWalletOutReq.setStatus(2);
			userWalletOutReq.setUpdateTime(new Date());
			userWalletOutService.updateUserWalletOut(userWalletOutReq);

			UserWallet userWallet = userWalletService.selectUserWalletByUserId(userWalletOutReq.getUserId());
			BigDecimal refuseMoney = userWalletOutReq.getMoney().add(userWalletOutReq.getProceMoney());

			userWallet.setFreezeMoney(userWallet.getFreezeMoney().subtract(refuseMoney));
			userWallet.setMoney(userWallet.getMoney().add(refuseMoney));
			userWallet.setUpdateTime(new Date());

			ajaxResult = toAjax(userWalletService.updateUserWallet(userWallet));
		}
		if(ajaxResult == null){
			return success();
		}
		return ajaxResult;
	}


	/**
	 * 删除提现
	 */
	@RequiresPermissions("module:userWalletOut:remove")
	@Log(title = "提现", businessType = BusinessType.DELETE)
	@PostMapping( "/remove")
	@ResponseBody
	public AjaxResult remove(String ids) {
		return toAjax(userWalletOutService.deleteUserWalletOutByIds(ids));
	}
}
